package poo.biblioteca.controladores;

import biblioteca.excepciones.ExcepcionDeAplicacion;
import biblioteca.excepciones.ExcepcionDeBD;
import biblioteca.modelos.MdlMantenimiento;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.prefs.Preferences;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import poo.biblioteca.vistas.DlgConexion;
import poo.biblioteca.vistas.FrmPrincipal;

public class CtrPrincipal {

    FrmPrincipal frmPrincipal = null;
    DlgConexion dlgConexion = null;
    CtrLibros ctrLibros = null;
    CtrLectores ctrLectores = null;
    CtrPrestamos ctrPrestamos = null;
    CtrReportes ctrReportes = null;
    MdlMantenimiento mantenimiento = null;

    public CtrPrincipal(Preferences preferencias) {
        frmPrincipal = new FrmPrincipal();
        mantenimiento = new MdlMantenimiento(preferencias);

        inicializarControladores();

        try {
            mantenimiento.setPreferenciasAplicacion(preferencias);
        } catch (ExcepcionDeAplicacion ex) {
            mostrarDialogoDeConexion(null);
        }

        while (!mantenimiento.probarConexion()) {
            mostrarDialogoDeConexion(null);
        }

        frmPrincipal.mniConfigurarConexionAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarDialogoDeConexion(frmPrincipal);
            }
        });

        frmPrincipal.mniSalirAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        frmPrincipal.mniAcercaDeAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(frmPrincipal, "Esta es una "
                        + "aplicación desarrollada para el curso de POO en "
                        + "la UPN", "Acerca de", JOptionPane.INFORMATION_MESSAGE);
            }
        });

        frmPrincipal.mniRegistrarGeneroAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                ctrLibros.registrarGenero();
            }
        });

        frmPrincipal.mniMantenimientoGeneroAddActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                ctrLibros.mantenimientoGenero();
            }
        });

        frmPrincipal.mniRegistrarEditorialAddActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                ctrLibros.registrarEditorial();
            }
        });

        frmPrincipal.mniMantenimientoEditorialesAddActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                ctrLibros.mantenimientoEditorial();
            }
        });

        frmPrincipal.mniRegistrarAutorAddActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                ctrLibros.registrarAutor();
            }
        });

        frmPrincipal.mniMantenimientoAutoresAddActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                ctrLibros.mantenimientoAutor();
            }
        });

        frmPrincipal.mniRegistrarLibroAddActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                ctrLibros.registrarLibro();
            }
        });

        frmPrincipal.mniMnttoLibroAddActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                ctrLibros.mantenimientoLibro();
            }
        });

        frmPrincipal.mniRegistrarEjemplarAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                ctrLibros.registrarEjemplar();
            }
        });

        frmPrincipal.mniRegistrarTipoLectorAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ctrLectores.registrarTipoLector();
            }
        });

        frmPrincipal.mniRegistrarLectorAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ctrLectores.registrarLector();
            }
        });

        frmPrincipal.mniRegistrarPrestamoAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ctrPrestamos.registrarPrestamo();
            }
        });

        frmPrincipal.mniReportePrestamosActivosAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ctrReportes.reportarPrestamosActivos();
            }
        });

        frmPrincipal.setVisible(true);
        try {
            mantenimiento.crearDBManager(preferencias);
        } catch (ExcepcionDeBD ex) {
            frmPrincipal.mostrarError(ex.getMessage());
        }
    }

    public void mostrarDialogoDeConexion(final JFrame frame) {
        dlgConexion = new DlgConexion(frame, true);
        dlgConexion.setLocationRelativeTo(frame);


        MdlMantenimiento.DatosConexion datosConexion =
                mantenimiento.getDatosConexion();



        dlgConexion.setValoresPorDefecto(
                datosConexion.getHost(),
                datosConexion.getProtocol(),
                datosConexion.getDbName(),
                datosConexion.getUser(),
                datosConexion.getPassword());

        dlgConexion.addBtnAceptarActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

                try {
                    mantenimiento.setPreferencia("Host", dlgConexion.getHost());
                    mantenimiento.setPreferencia("Protocol", dlgConexion.getProtocol());
                    mantenimiento.setPreferencia("DBName", dlgConexion.getBDName());
                    mantenimiento.setPreferencia("User", dlgConexion.getUsuario());
                    mantenimiento.setPreferencia("Password", dlgConexion.getPassword());

                } catch (ExcepcionDeAplicacion ex) {
                    JOptionPane.showMessageDialog(frame, ex);
                } finally {
                    dlgConexion.setVisible(false);
                    dlgConexion = null;
                }


            }
        });

        dlgConexion.addBtnCancelarActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dlgConexion.setVisible(false);
                dlgConexion = null;
            }
        });

        dlgConexion.btnTestAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                dlgConexion.setResultadoTest("");
                try {
                    mantenimiento.probarConexion(dlgConexion.getConnectionString());

                    dlgConexion.setResultadoTest("Conexión exitosa");
                } catch (ExcepcionDeBD ex) {
                    dlgConexion.setResultadoTest("Error de conexión");
                }
            }
        });

        dlgConexion.btnSalirAddActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        dlgConexion.setVisible(
                true);

    }

    private void inicializarControladores() {
        ctrLibros = new CtrLibros(frmPrincipal);
        ctrLectores = new CtrLectores(frmPrincipal);
        ctrPrestamos = new CtrPrestamos(frmPrincipal);
        ctrReportes = new CtrReportes(frmPrincipal);
    }
}
